package com.xuecheng.media.service;


import com.adan.base.model.PageParams;
import com.adan.base.model.PageResult;
import com.adan.base.model.RestResponse;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xuecheng.media.model.dto.QueryMediaParamsDto;
import com.xuecheng.media.model.dto.UploadFileParamsDto;
import com.xuecheng.media.model.dto.UploadFileResultDto;
import com.xuecheng.media.model.po.MediaFiles;

import java.io.File;

/**
 * @author Mr.M
 * @version 1.0
 * @description 媒资文件管理业务类
 * @date 2022/9/10 8:55
 */
public interface MediaFileService extends IService<MediaFiles> {

    /**
     * @param pageParams          分页参数
     * @param queryMediaParamsDto 查询条件
     * @return com.xuecheng.base.model.PageResult<com.xuecheng.media.model.po.MediaFiles>
     * @description 媒资文件查询方法
     * @author Mr.M
     * @date 2022/9/10 8:57
     */
    PageResult<MediaFiles> queryMediaFiles(Long companyId, PageParams pageParams, QueryMediaParamsDto queryMediaParamsDto);

    /**
     * 上传图片文件的通用接口(putObjectArgs方法)
     * 适合上传小文件，上传速度快
     * @param companyId 机构id
     * @param uploadFileParamsDto 文件信息
     * @param bytes 文件字节数组
     * @param folder  桶下边的子目录
     * @param objectName 对象名称
     * @return UploadFileResultDto
     */
    UploadFileResultDto uploadFile(Long companyId, UploadFileParamsDto uploadFileParamsDto, byte[] bytes, String folder, String objectName);

    /**
     * 保存文件到数据库
     * @param companyId 机构id
     * @param uploadFileParamsDto 文件信息
     * @param objectName 文件名称
     * @param fileMD5 文件md5
     * @param bucket 桶
     * @return MediaFiles
     */
    MediaFiles saveFileToDB(Long companyId, UploadFileParamsDto uploadFileParamsDto, String objectName, String fileMD5, String bucket);

    /**
     * 检查文件是否存在
     * @param fileMd5 文件的md5
     * @return boolean
     */
    RestResponse<Boolean> checkFile(String fileMd5);

    /**
     * 检查分块是否存在
     * @param fileMd5       文件的MD5
     * @param chunkIndex    分块序号
     * @return boolean
     */
    RestResponse<Boolean> checkChunk(String fileMd5, int chunkIndex);

    /**
     * 上传分块
     * @param fileMd5   文件MD5
     * @param chunk     分块序号
     * @param localChunkFilePath    本地文件绝对路径
     * @return
     */
    boolean uploadChunk(String fileMd5,int chunk, String localChunkFilePath);

    /**
     * 合并文件
     * @param companyId 机构 id
     * @param fileMd5 文件 md5
     * @param chunkTotal 分块总和
     * @param uploadFileParamsDto 文件信息
     * @return
     */
    RestResponse mergeChunks(Long companyId,String fileMd5,int chunkTotal,UploadFileParamsDto uploadFileParamsDto);


    /**
     * 预览文件
     * @param mediaId 文件md5
     * @return 文件的地址
     */
    MediaFiles getPlayUrlByMediaId(String mediaId);

    File downloadFileFromMinIO(String bucket, String filePath);

    boolean uploadFileToMinio(String bucket, String mimeType, String chunkFileFolderPath, String localChunkFilePath);
}
